#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

//core dump
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        sleep(200);
        // sleep(2);
        // int a = 10;
        // a /= 0;

        // int* p = nullptr;
        // *p = 10;

        exit(0);
    }

    int status = 0;
    pid_t rid = waitpid(id, &status, 0);

    if(rid > 0)
    {
        printf("exit code: %d, exit signal: %d, core dump: %d\n", 
                (status>>8)&0xff, status&0x7f, (status>>7)&0x1);
    }

}



//异常
// void handler(int signo)
// {
//     std::cout << "我捕捉到一个信号: " << signo << std::endl;
//     // sleep(1);
// }

// int main()
// {
//     // signal(SIGFPE, handler);
//     // /0: 浮点数错误
//     // int a = 13;
//     // a /= 0;

//     //野指针:段错误
//     int* p = nullptr;
//     *p = 10;

//     printf("进程崩溃了!\n");

//     return 0;
// }

// int cnt = 0;
// void handler(int signo)
// {
//     std::cout << "我捕捉到一个信号: " << signo << "cnt 为: " << cnt << std::endl;
//     // alarm(3);//重新设置闹钟
// }

// int main()
// {
//     signal(14, handler);
//     alarm(1);
//     while (true)
//     {
//         cnt++;//内存操作:效率优于IO
//         // std::cout << cnt++ << std::endl;//本质是IO
//     }
    
//     return 0;
// }

//./mykill signo pid
// int main(int argc, char* argv[])
// {
//     //命令14:SIGALRM
//     signal(14, handler);
//     alarm(3);//设定一个闹钟
//     sleep(1);
//     // alarm(0);//取消闹钟
//     int n = alarm(5);//返回是一个设定的闹钟离相应剩余的时间
//     std::cout << "剩余时间: " << n << std::endl;

//     while(true)
//     {
//         std::cout << "I am a process: " << getpid() << std::endl;
//         sleep(1);
//     }



//     //kill
//     // if(argc != 3)
//     // {
//     //     std::cerr << "Usage: " << argv[0] << "signo pid" << std::endl;
//     //     exit(1); 
//     // }

//     // //字符转其他类型
//     // int signo = std::stoi(argv[1]);
//     // pid_t pid = std::stoi(argv[2]);

//     // int n = kill(pid, signo);
//     // if(n < 0)
//     // {
//     //     perror("kill");
//     //     exit(2);
//     // }

//     //raise
//     // signal(2, handler);
//     // while(true)
//     // {
//     //     raise(2);
//     //     sleep(3);
//     // }

//     // abort:6号命令,用于结束进程
//     // signal(6, handler);
//     // abort();

    

//     return 0;
// }



